import argparse
import cv2
import os
from pathlib import Path

def main():
    parser = argparse.ArgumentParser(description='将图片序列转换为视频')
    parser.add_argument('input', help='输入图片目录路径')
    parser.add_argument('-o', '--output', help='输出视频文件路径')
    parser.add_argument('-f', '--fps', type=int, default=24, 
                       help='输出视频的帧率（默认：24）')
    
    args = parser.parse_args()
    
    # 检查输入目录是否存在
    if not os.path.isdir(args.input):
        print(f"错误: 输入目录 '{args.input}' 不存在")
        return
    
    # 获取图片文件列表
    image_files = []
    for ext in ['*.jpg', '*.jpeg', '*.png', '*.bmp']:
        image_files.extend(Path(args.input).glob(ext))
    
    # 按文件名排序
    image_files.sort()
    
    if len(image_files) == 0:
        print(f"错误: 在目录 '{args.input}' 中未找到图片文件")
        return
    
    # 读取第一张图片以获取尺寸信息
    first_image = cv2.imread(str(image_files[0]))
    if first_image is None:
        print(f"错误: 无法读取图片 '{image_files[0]}'")
        return
    
    height, width, layers = first_image.shape
    
    
    # 打印输出视频信息
    print("=" * 50)
    print("输出视频信息:")
    print(f"输出路径: {args.output}")
    print(f"帧率(FPS): {args.fps}")
    print(f"总帧数: {len(image_files)}")
    print(f"分辨率: {width} x {height}")
    print(f"时长: {len(image_files)/args.fps:.2f} 秒")
    print("=" * 50)
    
    if args.output is None:
        return
    
    # 创建视频写入对象
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out = cv2.VideoWriter(args.output, fourcc, args.fps, (width, height))
    # 处理所有图片
    processed_count = 0
    for img_path in image_files:
        img = cv2.imread(str(img_path))
        if img is None:
            print(f"警告: 无法读取图片 '{img_path}'，跳过")
            continue
            
        out.write(img)
        processed_count += 1
        
        # 打印进度
        if processed_count % 50 == 0:
            print(f"已处理 {processed_count} 张图片...")
    
    out.release()
    
    print(f"转换完成! 共处理 {processed_count} 张图片，输出视频为 '{args.output}'")

if __name__ == "__main__":
    main()